<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>flat-unique-sort-array</title>
</head>

<body>
    <p>
        将数组const arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10] 扁平化/去重/排序，性能如何
    </p>
    <script src="/utils/benchmark.js"></script>
    <script>
        const arr = [[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10];

        const fns = [(function one(s) {
            return Array.from(new Set(s.flat(Infinity))).sort((a, b) => a - b)
        }),

        (function two(s) {
            return Array.from(new Set(s.toString().split(","))).sort((a, b) => a - b)
        }),
        (function three(s) {
            function unique(a) {
                return a.filter((item, index) => {
                    return a.indexOf(item) === index
                })
            }
            return unique(s.toString().split(",")).sort((a, b) => a - b).map(Number)
        })
        ];
        fns.forEach(f => console.log(f.name, f(arr)));
        Reflect.apply(Test, null, fns.map(f => { return { "name": f.name, 'fn': f, 'params': [arr] } }));


        const quickSort = (array) => {
            const sort = (arr, left = 0, right = arr.length - 1) => {
                if (left >= right) {//如果左边的索引大于等于右边的索引说明整理完毕
                    return
                }
                let i = left
                let j = right
                const baseVal = arr[j] // 取无序数组最后一个数为基准值
                while (i < j) {//把所有比基准值小的数放在左边大的数放在右边
                    while (i < j && arr[i] <= baseVal) { //找到一个比基准值大的数交换
                        i++
                    }
                    arr[j] = arr[i] // 将较大的值放在右边如果没有比基准值大的数就是将自己赋值给自己（i 等于 j）
                    while (j > i && arr[j] >= baseVal) { //找到一个比基准值小的数交换
                        j--
                    }
                    arr[i] = arr[j] // 将较小的值放在左边如果没有找到比基准值小的数就是将自己赋值给自己（i 等于 j）
                }
                arr[j] = baseVal // 将基准值放至中央位置完成一次循环（这时候 j 等于 i ）
                sort(arr, left, j - 1) // 将左边的无序数组重复上面的操作
                sort(arr, j + 1, right) // 将右边的无序数组重复上面的操作
            }
            const newArr = array.concat() // 为了保证这个函数是纯函数拷贝一次数组
            sort(newArr)
            return newArr
        }
    </script>
</body>

</html>